package com.cskaoyan.javase.oop1._17access._3why;
/**
 * 为什么使用访问权限修饰符?使用访问权限修饰符的好处是什么?,以及如何使用访问权限修饰符?
 *
 * 给类或者类中结构加上访问权限
 * 就相当于给房子加锁，没有钥匙（没有访问权限）就进不去（访问不到）
 * 但以上说的是正常情况
 * 房子的锁是可以撬开，是可以强行打破的，同样的访问权限符也不是绝对不可破解的。
 * 比如Java自身就提供了反射的特性，反射是可以破解访问权限的。
 * 私有在反射面前是没有意义的,因为反射可以破解私有.
 *
 * 那么就像给门加锁，是警告你不能逾越界限，否则就是违法操作一样。
 * 访问权限的使用，最基本的，自然是用来控制访问权限的（这是废话）。
 * 但也隐含了警告和暗示的作用：
 *      1.告诉代码的使用者，哪些地方不要触碰
 *      2.告诉代码的使用者,哪些地方应该使用
 * 起到警告、约束和指导代码使用者的功能。
 *
 * 具体的案例如下:
 *      1.在工具类中,所有的方法都是static方法,所以只需要类名点就可以完成需求了
 *          完全不需要创建对象,工具类的对象是毫无意义的
 *          所以为了提醒代码的使用者,就禁止该类允许创建对象:
 *              私有化构造器
 *          所有的工具类,在类的开头,总有一个声明外私有化构造器
 *
 *
 *      2.对于一个Java类来说,类中可能存在大量的方法
 *          这些方法当中,总的来说,可以分为两大类:
 *              a.为外界提供需求,实现功能的方法
 *              一般来说会提供public的访问权限(只要不私有,其它访问级别可以根据需求而定)
 *              b.为了实现a类方法的一些过程方法,中间方法
 *                  比如为了实现a类方法,中间需要调用几个过程方法
 *                  这些过程方法对外界是没有意义的
 *                  它们是a类方法的组成部分之一
 *                  那么这些过程方法,中间方法应该私有化
 *
 *          在以上方法的访问权限修饰符使用中,public和private就形成了鲜明对比
 *          作为使用者,只需要使用public(有访问权限)的方法即可
 *          private的就不用关心.
 *
 *
 *      3.设计模式中的应用.比如单例,工厂,它们的实现就需要私有化类的构造器.
 *
 *
 * 以上这样的使用方式好处是什么呢?
 * 如果你能够严格按照上述描述使用访问权限修饰符
 * 那么好处是显而易见的：把代码的开发者和代码的使用者给区分开来了：
 *
 *  1.代码使用者无需关心没有访问权限的代码，仅需要关心具有访问权限的部分就可以了。
 *      私有或者没有访问权限的部分，既然不让我看，不让我用，那我就老老实实不看，不用。
 *      而那些有权限的位置,需要使用者了解,需要使用者来使用.
 *  实际上，当你去使用别人的代码时，你也不希望需要完全读懂所有代码，才能够使用吧？
 *
 *  2.代码开发者，可以自由的开发，对外界没有访问权限部分的代码。
 *  这些私有的，或者对外界不可见部分的代码，叫做隐藏代码的具体实现细节，可以很方便的修改代码实现。
 *  对外界没有权限的代码,它的修改,删除等,最多只会影响到自身类,肯定不会影响到外界,所以对它们做修改是比较自由的
 *  但是对外界有权限的代码,能够随便修改吗? 显然是可以的
 *想一想，如果一个方法是public修饰的，在外界多处被使用，你敢随便就动这个方法代码吗？
 *
 * 如何使用访问权限修饰符呢?
 * 少给权限,多给private,当不能用private修饰时,先从默认权限开始考虑,只有确定一定会在不同包下任意访问时,才给public
 * 权限的给予,应该尽量吝啬,不要"大方".
 *
 * @since 16:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test();
    }

    public static void test() {
        test2();
    }

    // Access can be private
    // test2方法是实现test方法的一个过程方法,应该私有化
    public static void test2() {
        test3();
    }

    private static void test3() {

    }

}
